    /***
	* @Author zjy
	* 
	* 这份代码排除了两种情况，
	1. 即这样定义数组的:    [[[1,2,3]]],也就是说后台不支持List<List<List<...>>>这一类的封装,而且说实话吧，如果开发时候真要传这种数据类型,那可想而知前台代码是有多乱了,这就意味着完全有更好的数据结构代替它
	
	2. 是这种的: [100,{"money":200},[300]],即一个List集合里可以装多种类型对象,如果真的有这种需求,我觉得完全可以避免这么传
	* 
	* 
	**/
        
        //let v = {"arr": [1,2,3,4]};
        //arr[]=1&arr[]=2&arr[]=3&arr[]=4

        //let v = {passengers:[{"name":"Egor", "role":"pilot"},{"name":"DHH", "role":"2pilot"}]};
        //passengers[0][name]=Egor&passengers[0][role]=pilot&passengers[1][name]=DHH&passengers[1][role]=2pilot

	
	//定义字符栈
    var stack_chars = [];
    //定义[]括号栈
    var stack_parentheses = [];
	
	//定义这个下标变量是为了解决 {arr:[1,2,3]} ——> arr[]=1&arr[]=2&arr[]=3 这种情况
	//因为 arr[]=1&arr[]=2&arr[]=3 应该变成 arr[0]=1&arr[1]=2&arr[2]=3,所以定义了stackIdx是为了完成括号里下标的递增
    var stackIdx = -1;

    //判断当前读取的字符是否在[]中
    function inParentheses() {
        return stack_parentheses.length == 1;
    }

	//通过调用该方法完成将复杂对象obj转换成springmvc支持嵌套绑定的QueryString
    function serialize(obj) {
        let jqueryStr = decodeURIComponent(jQuery.param(obj));
        let serializeStr = "";
        for (let index = 0; index < jqueryStr.length; index++) {
            const c = jqueryStr[index];
            if (c === "[" || c === "]") {
                //入括号栈
                stack_parentheses.push(c);
                //检查是否栈满, 并进行相关操作
                serializeStr += checkCharsStack();
            } else {
                if (inParentheses()) {
                    stack_chars.push(c);
                } else {
                    //不在[]中的字符直接拼接到结果串中
                    serializeStr += c;
                }
            }
        }
        return serializeStr;
    }

    function checkCharsStack() {
        //栈满
        if (stack_parentheses.length >= 2) {
            let c;
            let str = "";
            let arr = [];
            while ((c = stack_chars.pop()) !== undefined) {
                //这里把pop出的内容又push进arr是为了防止字符顺序颠倒
                arr.push(c);
            }
            while ((c = arr.pop()) !== undefined) {
                str += c;
            }
            //[]出桟
            stack_parentheses.pop();
            stack_parentheses.pop();
            //如果符号栈为空只能说明JQuery序列化了没有key的数组,即序列化了这种 {arr:[1,2,3]} ——> arr[]=1&arr[]=2&arr[]=3
            if(str === ""){
                return "["+(++stackIdx)+"]";
            }else{
                stackIdx = -1;
            }
            //如果是其他字符，比如arr[1][name]应该转化成arr[1].name
            if (isNaN(parseInt(str))) {
                return "." + str;
            } else {
                //如果是数字，比如arr[1],转化后仍是arr[1], 即不需要动他
                return "[" + str + "]";
            }
        }
        return "";
    }
